package study.core.rdd.operator

import org.apache.spark.{SparkConf, SparkContext}

/**
 * 转换算子之键值操作aggregateByKey操作
 * 将数据根据不同的规则进行分区内计算和分区间计算
 *
 * @author zh
 * @date 2021/5/15 10:47
 */
object TestAggregateByKey {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("rddMap")
    val context = new SparkContext(sparkConf)

    // 准备集合
    val list = List(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("a", 5))
    // 创建RDD
    val rdd = context.makeRDD(list, 2)

    // 第一个参数是初始值
    // 第二个参数包含两个函数
    //    第一个函数是分区内操作   分区内根据key取最大值
    //    第二个函数是分区间操作   分区间根据key聚合
    val result = rdd.aggregateByKey(0)((x, y) => math.max(x, y), (x, y) => x + y)
    result.collect().foreach(println)

    context.stop()

    //(b,6)
    //(a,6)

  }

}
